'use strict'

const http=require('http');
const fs=require('fs');

// function parseBodyHeaders(data){
//     let headers={};
//     let dsplit=data.split('\r\n').filter(p=>p.length>0);
//     let ind;
//     let k;
//     for(let d of dsplit){
//         ind=d.indexOf(':')
//         if(ind<=0) continue;
//         k=d.substring(0,ind).toLowerCase();
//         headers[k]=d.substring(ind+1).trim();  //trim():取去除空格
//     }
//     let cpd=headers['content-disposition'];
//     //按照;分隔成数组，第一个元素form-data去掉
//     let clist=cpd.split(';').slice(1);
//     let name,filename;
//     for(let a of clist){
//         ind=a.indexOf('filename="');
//         if(ind>=0){
//             filename=a.substring(ind+10,a.length-1)
//         }else{
//             name=a.substring(6,a.length-1);
//         }
//     }
//     return {
//         headers,
//         name,
//         filename
//     }

// }

/**
 * 
 * @param {Buffer} bodyData 原始的body数据
 * @param {Object} reqHeaders request.headers
 */

// function parseBody(bodyData,reqHeaders){
//     // content-type:multipart/form-DataTransfer;boundary=-------34294329
//     let ctype=reqHeaders['content-type'];

//     //拿到分界线boundary的数据
//     let boundary=ctype.substring(ctype.indexOf('=')+1);

//     //数据中用于分割文件的分界线(又在前面多加了两个-)
//     // boundary=`--${boundary}\r\n`;
//     let crlf_bdy=`\r\n--${boundary}`;
//     //从偏移boundary的长度开始查找下一个分界线的位置
//     let data_end_index=bodyData.indexOf(crlf_bdy,crlf_bdy.length);
//     //body消息数据中header部分的最后索引
//     let header_end_index=bodyData.indexOf('\r\n\r\n',crlf_bdy.length);
//     //(编码格式，开始的索引值，结束的位置)
//     let header_data=bodyData.toString('utf-8',crlf_bdy.length,header_end_index);

//     //解析body数据中的消息头
//     let hd=parseBodyHeaders(header_data);

//     let fileinfo={
//         start:header_end_index+4,
//         end:data_end_index
//     }
//     fileinfo.length=fileinfo.end-fileinfo.start

//     return {
//         name:hd.name,
//         filename:hd.filename,
//         headers:hd.headers,
//         start:fileinfo.start,
//         end:fileinfo.end,
//         length:fileinfo.length

//     }
// }

let routerTable={
    GET:{   // GET /upload HTTP/1.1
        '/upload':async(request,response)=>{
            let stm=fs.createReadStream('./upload.html');
            stm.pipe(response);
            stm.on('end',()=>{
                // 如果不设置content-type, 浏览器往往会自动推导，一般只需要通过响应数据的前几个字符就可以判断数据格式。
                response.end();
            })
        }
    },
    POST:{   // POST /upload HTTP/1.1
        '/upload':async(request,response)=>{
            console.log(request.headers['content-type']);
            let bufferList=[];
            let totalLength=0;
            request.on('data',(chunk)=>{
                totalLength+=chunk.length;
                bufferList.push(chunk);
            });
            let bodyData=null;
            request.on('end',()=>{
                bodyData=Buffer.concat(bufferList,totalLength);
                bufferList=[];

                //解析body数据
                // let body=parseBody(bodyData,request.headers);
                // console.log(body);

                response.setHeader('content-type','text/plain;charset=utf-8');
                response.end(bodyData);
            })
        }
    }
}

let serv=http.createServer();
serv.on('request',(request,response)=>{
    let rm=routerTable[request.method];

    let usplit=request.url.split('?');  //完整的路径可能会含有参数，例如：http://a.com:1234/xyz?a=123 ,request.url='/xyz?a=123'
    let pathname=usplit[0];
    let querystring=usplit[1] || '';  //左侧为true就返回左

    if(!rm || !rm[pathname]){  //既不是GET也不是POST,或者不满足request.url为'/upload'
        response.statusCode=404;
        response.end('page not found');
        return
    }
    rm[pathname](request,response);
})

serv.listen(3456);